package com.framework.common.mongodb;

import com.framework.common.mongodb.em.QueryModel;
import com.framework.common.mongodb.entity.QueryEntity;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;
import java.util.Map;

public interface BaseMongoService<T> {

	//保存一个对象到mongodb
    T save(T bean);
    
    List<T> saveCollectio(List<T> list);
 
    // 根据id删除对象
    void deleteById(T t);
 
    // 根据对象的属性删除
    void deleteByCondition(T t);

    //根据查询条件删除
    boolean deleteByCondition(Map<String, QueryEntity> queryMap, QueryModel model);
    
    void deleteByCondition(Query query);
 
    // 通过条件查询更新数据
    void update(Query query, Update update);
 
    // 根据id进行更新
    void updateById(String id, T t);

    /**
     * 分页查询
     * @param query 查询条件
     * @param pageable 分页参数
     * @param sort 排序规则
     * @return
     */
    List<T> listPage(Query query, Pageable pageable, Sort sort);
 
    // 通过条件查询实体(集合)
    List<T> find(Query query);

    /**
     * 根据条件查询
     * @param queryMap 条件集合
     * @param model 查询规则
     * @return
     */
    List<T> findByCondition(Map<String, QueryEntity> queryMap, QueryModel model);

    /**
     * 根据条件分页查询
     * @param queryMap
     * @param model
     * @param pageable
     * @param sort
     * @return
     */
    List<T> findByConditionAndPage(Map<String, QueryEntity> queryMap, QueryModel model, Pageable pageable, Sort sort);
 
    List<T> findByCondition(T t);

    List<T> findAll();
 
    /**
     * 
     * @param t
     * @param sort			排序
     * @param resultFileds	返回字段
     * @return
     */
    List<T> findByConditionAndSort(T t, Sort sort, String... resultFileds);
    
    List<T> findByConditionAndSortLimit(T t, Sort sort, int limit, String... resultFileds);
    
    // 通过一定的条件查询一个实体
    T findOne(Query query);
 
    // 通过ID获取记录
    T get(String id);
 
    // 通过ID获取记录,并且指定了集合名(表的意思)
    T get(String id, String collectionName);
 
    MongoTemplate getMongoTemplate();
}
